package string;

/**
 * @author Huangjin
 * @version 1.0
 * describe:String的演示
 * @date 2023/2/28 9:44
 */
public class StringDemo {
    public static void main(String[] args) {
        /*
         *使用字面量（""）来创建对象时，JVM会检查常量是中是否有该对象
         * 1）若没有，则会创建字符串对象，并将其引入到常量池中
         * 2）若有，则直接将常量池中的对象（引用）返回，并不会创建新的字符串对象
         */
        //常量池还没有，因此创建该字符串对象，并放入常量池中
        String s1 = "123abc";
        //常量池中已经有了，直接复用了
        String s2 = "123abc";
        //常量池中已经有了，直接复用了
        String s3 = "123abc";
        //引用类型==，比较的是地址是否相同----这是规定
        System.out.println(s1==s2);
        System.out.println(s1==s3);
        System.out.println(s2==s3);
        //创建你新的字符串对象（”123abc！“），并将地址赋值给s1
        s1 = s1+"!";

        //String  str = new String("hello");------
        //堆中创建123abc字符量对象，并缓存到常量池中
        String t1 = "123abc";
        /*
            编译器在编译时，若发现是两个字面量相连，则会直接连接好并将结果保存起来
            如下语句被编译为：String s2 = "123abc";
         */
        String t2 = "123abc";
        System.out.println(t1 == t2);
        String t3 = "123";
        //因为t3是一个变量，所以在编译期并不会直接编译好
        //创建一个新的对象储存123abc
        String t4 = t3+"abc";
        System.out.println(t1==t4);
    }
    public void topic(){
        /*
           常见面试题：
              String s = new String("hello");
              问：如上语句创建了几个对象？
              答：2个
              第一个：字面量“hello”
              -------java会创建一个String()对象表示字面量"hello"，并将其存入常量池中
              第二个：new String()
              -------new String()时会再在创建一个字符串对象，并引用hello字符串内容
         */
        //创建了2个对象
        String s = new String("hello");
        //复用常量池中的字面量对象地址
        String s1 = "hello";
        //false,==比较的是地址是否相同
        System.out.println(s==s1);

    }
}
